import ffi from 'ffi-napi'
import ref from 'ref-napi'
import iconv from 'iconv-lite';
import {
  GSAConstants
} from './com'

// Port-串口号，整形变量，1对应计算机COM1，建议输入范围为1-16
const iport = GSAConstants().BAR_COM.new
// const iport = 4 

export default {
  //加载DLL  
  initDll () {
    console.log('=====init bar dll=====')
    let proxy_dll = ffi.Library(`${process.env.libPath}/ia32/hrBarCtrlx86.dll`, {
      "Connect": ['int', ['int']],
      "GetBarStatus": ['int', []],
      "RaiseBar": ['int', []],
      "Disconnect": ['int', []]
    })
    return proxy_dll
  },
  // 连接砸口
  connectBar (proxy_dll) {
    const connectStatus = proxy_dll.GetBarStatus()
    if (connectStatus === 1 || connectStatus === 0) {
      // 断开连接， 重新连
      proxy_dll.Disconnect()
    }
    /**
     * 返回：0-成功
      -1表示打开串口失败
      -2表示发送握手数据失败
      -3表示接收握手反馈失败
      -4表示反馈数据校验不通过
     * 
     */
    let i = 0
    while (i < 10) {
      console.log('=====start to connect bar=====')
      i++
      const status = proxy_dll.Connect(iport)
      if (status === 0) {
        console.log('=====success=====')
        return 1;
      } else if (status === -1) {
        console.log('=====打开串口失败=====')
      } else if (status === -2) {
        console.log('=====发送握手数据失败=====')
      } else if (status === -3) {
        console.log('=====接收握手反馈失败=====')
      } else if (status === -4) {
        console.log('=====反馈数据校验不通过=====')
      } else {
        console.log('=====未知异常, 状态码为 : [', status, ']')
      }

      // 重试10次
      if (i > 10) {
        break
      }
    }
    return 0
  },
  // 检测连接状态
  checkConnect (proxy_dll) {
    const status = proxy_dll.GetBarStatus()

    /**
     * 2-闸杆状态异常
        1-闸杆在上限位（道闸打开）
        0-闸杆在下限位（道闸关闭）
        -1表示串口未打开
        -2表示发送查询命令失败
        -3表示接收闸杆状态失败
        -4表示反馈数据校验不通过
     */
    if (status === 2) {
      console.log('=====闸杆状态异常=====', status)
      console.error('=====闸杆状态异常=====', status)
    } else if (status === 1) {
      console.log('=====闸杆在上限位（道闸打开）=====')
      return 1
    } else if (status === 0) {
      console.log('=====闸杆在下限位（道闸关闭）=====')
      return 1
    } else if (status === -1) {
      console.log('=====串口未打开=====')
    } else if (status === -2) {
      console.log('=====查询命令失败=====')
    } else if (status === -3) {
      console.log('=====接收闸杆状态失败=====')
    } else if (status === -4) {
      console.log('=====反馈数据校验不通过=====')
    } else {
      console.log('=====未知异常, 状态码为 : [', status, ']')
    }

    // 重新连接 咂口
    console.log('=====开始重新连接咂口 : [', status, ']')
    this.connectBar(proxy_dll)
  },
  // 道闸打开
  raise (proxy_dll) {
    //  0-成功
    // -1表示串口未打开
    // -2表示发送抬杆数据失败
    // -3表示接收抬杆反馈失败
    // -4表示反馈数据校验不通过
    const status = proxy_dll.RaiseBar()
    if (status === 0) {
      console.log('=====成功=====')
      return {
        code: 200,
        msg: 'success！'
      }
    } else if (status === -1) {
      console.log('=====串口未打开=====')
    } else if (status === -2) {
      console.log('=====查询命令失败=====')
    } else if (status === -3) {
      console.log('=====接收闸杆反馈失败=====')
    } else if (status === -4) {
      console.log('=====反馈数据校验不通过=====')
    } else {
      console.log('=====未知异常, 状态码为 : [', status, ']')
    }

    // 开线程来处理， 重练
    // setTimeout(() => {
    //   this.checkConnect(proxy_dll)
    // }, 1000)
    return {
      code: 999,
      msg: '闸机故障，请联系服务台！'
    }
  }
}